package com.mephi.oshs.view.impl;

import com.mephi.oshs.model.entry.Entry;
import com.mephi.oshs.model.entry.IEntry;
import com.mephi.oshs.model.interpreter.api.IContext;
import com.mephi.oshs.model.interpreter.api.IExpression;
import com.mephi.oshs.model.interpreter.impl.TestContext;
import com.mephi.oshs.view.api.ISearchView;
import com.mephi.oshs.view.api.ViewId;
import com.mephi.oshs.view.elements.Clickable;
import com.mephi.oshs.view.elements.IClickable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

import static com.mephi.oshs.model.interpreter.ExpressionFactory.*;
import static com.mephi.oshs.view.impl.GridLayoutManager.getGridLayout;
import static com.mephi.oshs.view.impl.GridLayoutManager.getLayoutDataFillHorizontal;

public class SearchView extends AbstractView implements ISearchView {


    private final IEntry key = new Entry("key-object");
    private Button expressionSearchButton;
    private Text expressionSearchText;

    private String name = "";
    private IExpression expression;

    @Override
    public ViewId getViewID() {
        return ID;
    }

    @Override
    public void createGUI() {
        this.parent.setLayout(getGridLayout());

        final Label label = new Label(parent, SWT.NONE);
        label.setLayoutData(getLayoutDataFillHorizontal());
        label.setText("Поиск:");
        label.setAlignment(SWT.CENTER);

        final Text text = new Text(parent, SWT.BORDER);
        text.setLayoutData(getLayoutDataFillHorizontal());
        text.setText("1_1_1");

        this.expressionSearchText = text;

        final Button search = new Button(parent, SWT.CENTER);
        search.setLayoutData(getLayoutDataFillHorizontal());
        search.setText("Искать");

        this.expressionSearchButton = search;
    }

    @Override
    public IClickable getExpressionSearchAction() {
        return new Clickable(this.expressionSearchButton);
    }

    @Override
    public IExpression getSearchExpression() {
        return this.getSearchInNameExpression(this.expressionSearchText.getText(), this.key);
    }

    @Override
    public IContext getSearchContext() {
        return new TestContext();
    }

    @Override
    public Object getObjectKey() {
        return this.key;
    }

    private IExpression getSearchInNameExpression(final String name, final IEntry testEntry) {

        // Если запросов ещё не было, или это новый запрос.
        if (this.expression == null || !this.name.equals(name)) {
            this.name = name;

            // Используем геттер на элементе для получения имени.
            final IExpression varLName = getVariableExpression(testEntry, "getShortName");

            // Константа - строка name.
            final IExpression constLName = getConstantExpression(name);

            // Смотрим содержится ли в результате первого выражения результат второго выражения:
            // в фамилии контакта строка name.
            this.expression = getContainsExpression(varLName, constLName);
        }
        return this.expression;
    }
}
